#ifndef SDP_H_
#define SDP_H_
#include <iostream>
#include <string>
#include <vector>
#include "rtsp_common.h"
/*
v=0
o=- 91720590340 1 IN IP4 192.168.10.17
c=IN IP4 192.168.10.17
t=0 0
a=control:*
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1
a=control:track0
m=audio 0 RTP/AVP 97
a=rtpmap:97 MPEG4-GENERIC/44100/2
a=fmtp:97 streamtype=5;profile-level-id=1;mode=AAC-hbr;config=1390;sizelength=13;indexlength=3;indexdeltalength=3
a=control:track1
*/
struct MediaInfo{
    std::string media_name; // video audio
    MediaEnum media_type;   // 媒体类型
    std::string contorl;    // track0 track1 or url/track0 url/track1

    int payload;            // rtp payload
    int sample_rate;
    int sample_rate_index;
    int channels;           // only audio
    int profile;            // only audio from config=1390
};
struct SdpInfo{
    std::string contorl;            // * or url
    struct MediaInfo media_info[2]; // 0-video 1-audio  
    int media_count;
};
class SDPParse{
public:
    // 构造函数，传入 SDP 描述字符串和基础 URL
    SDPParse(std::string sdp, std::string base_url);
    // 析构函数
    ~SDPParse();
    // 解析 SDP 数据，返回解析状态
    int Parse();
    // 获取视频流的 URL
    std::string GetVideoUrl();
    // 获取音频流的 URL
    std::string GetAudioUrl();
    // 获取视频流的 RTP payload
    int GetVideoPayload(){return sdp_info_.media_info[0].payload;}
    // 获取音频流的 RTP payload
    int GetAudioPayload(){return sdp_info_.media_info[1].payload;}
    // 获取视频流的媒体类型
    enum MediaEnum GetVideoType() {return sdp_info_.media_info[0].media_type;}
    // 获取音频流的媒体类型
    enum MediaEnum GetAudioType() {return sdp_info_.media_info[1].media_type;}
    // 获取音频流详细信息：采样率索引、声道数和配置文件级别
    void GetAudioInfo(int &sample_rate_index, int &channels, int &profile) {
        sample_rate_index = sdp_info_.media_info[1].sample_rate_index;
        channels = sdp_info_.media_info[1].channels;
        profile = sdp_info_.media_info[1].profile;
        return;
    }
private:
    // 解析 SDP 会话部分
    int ParseSession();
    // 解析视频部分的描述信息
    int ParseVideo();
    // 解析音频部分的描述信息
    int ParseAudio();
private:
    std::string sdp_;                  // 完整 SDP 描述字符串
    std::string base_url_;             // 基础 URL，用于构造媒体流 URL
    std::string sdp_session_;          // SDP 会话描述部分
    std::vector<std::string> media_descriptions_; // 媒体描述行的向量集合
    std::string sdp_video_ = "";       // 单独的视频 SDP 描述
    std::string sdp_audio_ = "";       // 单独的音频 SDP 描述
    struct SdpInfo sdp_info_;          // 存储解析后的 SDP 信息
};;
#endif